package cn.com.dcsgo.sdk.payment.wechat.ltzf.payments.h5.model;

import cn.com.dcsgo.sdk.payment.wechat.ltzf.utils.SignUtils;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;

import java.util.HashMap;
import java.util.Map;

/**
 * 预付请求实体类
 *
 * @author Dcsgo
 * @since 2024/8/15 15:18
 */
@Data
public class PrepayRequest {
    /**
     * 商户号(必填)
     */
    @JsonProperty("mch_id")
    private String mchId;
    /**
     * 商户订单号(必填)，只能是数字、大小写字母_-且在同一个商户号下唯一
     */
    @JsonProperty("out_trade_no")
    private String outTradeNo;
    /**
     * 支付金额(必填)
     */
    @JsonProperty("total_fee")
    private String totalFee;
    /**
     * 商品描述(必填)
     */
    @JsonProperty("body")
    private String body;
    /**
     * 当前时间戳(秒)(必填)
     */
    private String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
    /**
     * 支付通知地址(必填)，通知URL必须为直接可访问的URL，不允许携带查询串，要求必须为http或https地址
     */
    @JsonProperty("notify_url")
    private String notifyUrl;
    /**
     * 取消支付自动跳转到该地址(非必填)，跳转不会携带任何参数，如需携带参数请自行拼接(如果此参数未设置，将使用return_url的参数跳转)
     */
    @JsonProperty("quit_url")
    private String quitUrl;
    /**
     * 回跳地址(非必填)，支付成功后或取消支付自动跳转到该地址，跳转不会携带任何参数，如需携带参数请自行拼接
     */
    @JsonProperty("return_url")
    private String returnUrl;
    /**
     * 附加数据(非必填)，在支付通知中原样返回，可作为自定义参数使用
     */
    @JsonProperty("attach")
    private String attach;
    /**
     * 订单失效时间(非必填)，枚举值：
     * m：分钟
     * h：小时
     * 取值范围：1m～2h（接口请求后开始计算时间）
     */
    @JsonProperty("time_expire")
    private String timeExpire;
    /**
     * 开发者应用ID(非必填)
     */
    @JsonProperty("developer_appid")
    private String developerAppid;

    /**
     * 根据其他必要信息和商户密钥生成签名
     * @param partnerKey 商户密钥
     * @return 签名
     */
    public String createSign(String partnerKey) {
        Map<String, String> params = new HashMap<>();
        params.put("mch_id", getMchId());
        params.put("out_trade_no", getOutTradeNo());
        params.put("total_fee", getTotalFee());
        params.put("body", getBody());
        params.put("timestamp", getTimestamp());
        params.put("notify_url", getNotifyUrl());
        return SignUtils.createSign(params, partnerKey);
    }
}
